package com.tony.demo.ui.performance.xnyh.memory;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class TestReference {

    public static void main(String[] args) throws Exception {
//        testPhantomReference();
        testWeakReference();
    }

    /**
     * 软引用： 只有在内存不足的时候才会回收； 处理后台信息，比如一个界面里的多张图片(视频:内存优化一)
     * 弱引用： GC来了的时候就会回收，
     * 虚引用： 跟踪GC作用， 比如在做自动化测试工具，或需要跟踪GC回收时机的时候可以用到虚引用
     */
    public static void testWeakReference() throws InterruptedException {
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        Object object = new Object();
        WeakReference<Object> weakReference = new WeakReference<>(object, referenceQueue);

        System.out.println("weakReference: " + weakReference.get()); //结果  java.lang.Object@66d3c617
        System.out.println("referenceQueue: " + referenceQueue.poll()); //看引用队列中是否有值  结果 null

        object = null;
        System.gc();
        Thread.sleep(2000);

        System.out.println("weakReference: " + weakReference.get()); //结果  null
        //看引用队列中是否有值  结果 java.lang.ref.WeakReference@63947c6b
        System.out.println("referenceQueue: " + referenceQueue.poll());
    }

    public static void testPhantomReference() throws InterruptedException {
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        Object object = new Object();
        PhantomReference<Object> phantomReference = new PhantomReference<>(object, referenceQueue);

        //虚引用不对对象的生命周期产生任何的影响   主要用来跟踪对象的回收时期，告知程序员对象被回收了
        System.out.println("phantomReference: " + phantomReference.get()); //结果  null
        System.out.println("referenceQueue: " + referenceQueue.poll()); //看引用队列中是否有值  结果 null

        object = null;  //这里置空后，就将object的引用链断开了，系统会将object对象放入引用队列中
        System.gc();
        Thread.sleep(2000);

        System.out.println("phantomReference: " + phantomReference.get()); //结果  null
        //看引用队列中是否有值  结果 java.lang.ref.PhantomReference@66d3c617  类名 + @ + hashCode
        System.out.println("referenceQueue: " + referenceQueue.poll());
    }
}
